package com.xiyuan.smartutils.control;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 锁定义，通常运行于（生产-消费）多线程（运用对象中wait和notify方法转化为队列的锁定状态<br><br>
 * 1、锁定时同步，忽略异常
 * 2、解锁时同步，并通知全部队列中的线程
 *
 * @version v1.0.0 @author lgz 2017-8-27 新建与整理
 */
public final class Lock {
    
    private ReentrantLock lock = new ReentrantLock();
    private Condition notEmpty = lock.newCondition();
    /**
     * 消费者线程调用，锁定当前线程，等待生产者线程通知或等待时间结束自动唤醒
     *
     * @param timeout 等待时间，单位毫秒
     */
    public boolean lock(long timeout) {
        try {
            return lock.tryLock(timeout, TimeUnit.SECONDS);
        }
        catch (InterruptedException e) {
            return false;
        }
    }
    
    public void lock() {
        lock.lock();
    }
    
    /**
     * 生产者线程调用，通知正在等待的某个消费者线程结束阻塞线程
     */
    public  void unlock() {
        lock.unlock();
    }
    public  void unlockAll() {
        notEmpty.signalAll();// // 入队后，通知可能在等待的消费者
    }
}
